WebAssembly์ ๊ฐ๋น์ง ์ปฌ๋ ์ (GC)๊ณผ ์ฐธ์กฐ ์ถ์ ๋ฉ์ปค๋์ฆ์ ๋ณต์ก์ฑ์ ํ๊ตฌํฉ๋๋ค. ๋ค์ํ ๊ธ๋ก๋ฒ ํ๋ซํผ์์ ํจ์จ์ ์ด๊ณ ์์ ํ ์คํ์ ์ํด ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ๊ฐ ์ด๋ป๊ฒ ๋ถ์๋๋์ง ์ดํดํด ๋ณด์ธ์.
WebAssembly GC ์ฐธ์กฐ ์ถ์ : ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ๋ถ์ ์ฌ์ธต ํ๊ตฌ
WebAssembly(Wasm)๋ ํ์ ๊ธฐ์ ์์ ํ๋ ์น ๊ฐ๋ฐ ๋ฐ ๊ทธ ์ด์์ ๋ถ์ผ์์ ํ์์ ์ธ ๊ตฌ์ฑ ์์๋ก ๋น ๋ฅด๊ฒ ๋ฐ์ ํ์ต๋๋ค. ๋ค์ดํฐ๋ธ์ ๊ฐ๊น์ด ์ฑ๋ฅ, ๋ณด์ ๋ฐ ์ด์์ฑ์ ๋ํ ์ฝ์์ ๋ณต์กํ ์น ๊ฒ์ ๋ฐ ๊น๋ค๋ก์ด ๋ฐ์ดํฐ ์ฒ๋ฆฌ์์๋ถํฐ ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์๋ฒ ๋๋ ์์คํ ์ ์ด๋ฅด๊ธฐ๊น์ง ๊ด๋ฒ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋งค๋ ฅ์ ์ธ ์ ํ์ด ๋์์ต๋๋ค. WebAssembly ๊ธฐ๋ฅ์ ์ค์ํ๋ฉด์๋ ์ข ์ข ๋ ์ดํด๋๋ ์ธก๋ฉด์ ์ ๊ตํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ, ํนํ ๊ฐ๋น์ง ์ปฌ๋ ์ (GC) ๊ตฌํ๊ณผ ๊ทธ ๊ธฐ๋ฐ์ด ๋๋ ์ฐธ์กฐ ์ถ์ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์๊ฒ Wasm์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํ์ ํ๋ ๊ฒ์ ํจ์จ์ ์ด๊ณ ์์ ์ ์ด๋ฉฐ ์์ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ WebAssembly GC ์ฐธ์กฐ ์ถ์ ์ ๋ช ํํ ์ค๋ช ํ์ฌ ๋ชจ๋ ๋ฐฐ๊ฒฝ์ ๊ฐ๋ฐ์๋ค์๊ฒ ํฌ๊ด์ ์ด๊ณ ์ ์ธ๊ณ์ ์ผ๋ก ๊ด๋ จ์ฑ ์๋ ๊ด์ ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
WebAssembly์์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ํ์์ฑ ์ดํดํ๊ธฐ
์ ํต์ ์ผ๋ก C ๋ฐ C++์ ๊ฐ์ ์ธ์ด์์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ์๋ ํ ๋น ๋ฐ ํด์ ์ ์์กดํฉ๋๋ค. ์ด๋ ์ธ๋ฐํ ์ ์ด๋ฅผ ์ ๊ณตํ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ๋์, ๋๊ธ๋ง ํฌ์ธํฐ, ๋ฒํผ ์ค๋ฒํ๋ก์ ๊ฐ์ ๋ฒ๊ทธ์ ์ผ๋ฐ์ ์ธ ์์ธ์ด ๋๋ฉฐ, ์ด๋ ์ฑ๋ฅ ์ ํ์ ์ฌ๊ฐํ ๋ณด์ ์ทจ์ฝ์ ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋ฐ๋ฉด์ Java, C#, JavaScript์ ๊ฐ์ ์ธ์ด๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ํตํด ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
WebAssembly๋ ์ค๊ณ์ ๋ก์ฐ๋ ๋ฒจ ์ ์ด์ ํ์ด๋ ๋ฒจ ์์ ์ฑ ์ฌ์ด์ ๊ฐ๊ทน์ ๋ฉ์ฐ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. Wasm ์์ฒด๊ฐ ํน์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ต์ ์ง์ํ์ง๋ ์์ง๋ง, ๊ฐ์ฅ ์ฃผ๋ชฉํ ๋งํ JavaScript์ ๊ฐ์ ํธ์คํธ ํ๊ฒฝ๊ณผ์ ํตํฉ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฒฌ๊ณ ํ ์ ๊ทผ ๋ฐฉ์์ ํ์๋ก ํฉ๋๋ค. WebAssembly ๊ฐ๋น์ง ์ปฌ๋ ์ (GC) ์ ์์ Wasm ๋ชจ๋์ด ํธ์คํธ์ GC์ ์ํธ ์์ฉํ๊ณ ์์ฒด ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ ๋์ ํ์ฌ, ์ ํต์ ์ผ๋ก GC์ ์์กดํ๋ ์ธ์ด(์: Java, C#, Python, Go)๊ฐ Wasm์ผ๋ก ๋ ํจ์จ์ ์ด๊ณ ์์ ํ๊ฒ ์ปดํ์ผ๋ ์ ์๋๋ก ํฉ๋๋ค.
์ด๊ฒ์ด ์ ์ ์ธ๊ณ์ ์ผ๋ก ์ค์ํ๊ฐ? Wasm ์ฑํ์ด ์ฌ๋ฌ ์ฐ์ ๊ณผ ์ง์ญ์ ๊ฑธ์ณ ์ฆ๊ฐํจ์ ๋ฐ๋ผ, ์ผ๊ด๋๊ณ ์์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ชจ๋ธ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ด๋ Wasm์ผ๋ก ๊ตฌ์ถ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉ์์ ์ฅ์น, ๋คํธ์ํฌ ์กฐ๊ฑด ๋๋ ์ง๋ฆฌ์ ์์น์ ๊ด๊ณ์์ด ์์ธก ๊ฐ๋ฅํ๊ฒ ๋์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ฌํ ํ์คํ๋ ํํธํ๋ฅผ ๋ฐฉ์งํ๊ณ ๋ณต์กํ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ๊ธ๋ก๋ฒ ํ์ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํฉ๋๋ค.
์ฐธ์กฐ ์ถ์ ์ด๋ ๋ฌด์์ธ๊ฐ? GC์ ํต์ฌ
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ณธ์ง์ ์ผ๋ก ํ๋ก๊ทธ๋จ์์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํ์ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ํจ๊ณผ์ ์ธ ๊ธฐ์ ์ ์ฐธ์กฐ ์ถ์ ์ ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๊ฐ์ฒด๊ฐ "๋ฃจํธ(root)" ๊ฐ์ฒด ์งํฉ์์ ํด๋น ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ ๊ฒฝ๋ก๊ฐ ์๋ ๊ฒฝ์ฐ "์ด์์๋(live)" ๊ฒ(์ฆ, ์ฌ์ ํ ์ฌ์ฉ ์ค์ธ ๊ฒ)์ผ๋ก ๊ฐ์ฃผ๋๋ค๋ ์์น์ ์์กดํฉ๋๋ค.
์์ ๋คํธ์ํฌ์ ๊ฐ๋ค๊ณ ์๊ฐํด๋ณด์ธ์. ๋น์ ์ ์๋ ๋๊ตฐ๊ฐ, ๊ทธ ๋๊ตฐ๊ฐ๋ฅผ ์๋ ๋ค๋ฅธ ๋๊ตฐ๊ฐ๊ฐ ๊ฒฐ๊ตญ ๋น์ ์ ์๋ ๊ฒฝ๋ก๊ฐ ๋คํธ์ํฌ ๋ด์ ์กด์ฌํ๋ค๋ฉด ๋น์ ์ "๋๋ฌ ๊ฐ๋ฅ(reachable)"ํฉ๋๋ค. ๋คํธ์ํฌ์ ๋๊ตฌ๋ ๋น์ ์๊ฒ ๋์์ค๋ ๊ฒฝ๋ก๋ฅผ ์ถ์ ํ ์ ์๋ค๋ฉด, ๋น์ ์ "๋๋ฌ ๋ถ๊ฐ๋ฅ(unreachable)"ํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ด ๋น์ ์ ํ๋กํ(๋ฉ๋ชจ๋ฆฌ)์ ์ ๊ฑฐ๋ ์ ์์ต๋๋ค.
๊ฐ์ฒด ๊ทธ๋ํ์ ๋ฃจํธ(Roots)
GC์ ๋งฅ๋ฝ์์ "๋ฃจํธ"๋ ํญ์ ์ด์์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ ํน์ ๊ฐ์ฒด์ ๋๋ค. ์ฌ๊ธฐ์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
- ์ ์ญ ๋ณ์: ์ ์ญ ๋ณ์์ ์ํด ์ง์ ์ฐธ์กฐ๋๋ ๊ฐ์ฒด๋ ํญ์ ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค.
- ์คํ์ ์ง์ญ ๋ณ์: ํ์ฑ ํจ์ ๋ด์ ํ์ฌ ๋ฒ์์ ์๋ ๋ณ์์ ์ํด ์ฐธ์กฐ๋๋ ๊ฐ์ฒด ๋ํ ์ด์์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ํจ์ ๋งค๊ฐ๋ณ์์ ์ง์ญ ๋ณ์๊ฐ ํฌํจ๋ฉ๋๋ค.
- CPU ๋ ์ง์คํฐ: ์ผ๋ถ ๋ก์ฐ๋ ๋ฒจ GC ๊ตฌํ์์๋ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ๋ ๋ ์ง์คํฐ๋ ๋ฃจํธ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค.
GC ํ๋ก์ธ์ค๋ ์ด๋ฌํ ๋ฃจํธ ์งํฉ์์ ๋๋ฌ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. ๋ฃจํธ์์ ์์ํ๋ ์ฐธ์กฐ ์ฒด์ธ์ ํตํด ๋๋ฌํ ์ ์๋ ๋ชจ๋ ๊ฐ์ฒด๋ "๊ฐ๋น์ง(garbage)"๋ก ๊ฐ์ฃผ๋์ด ์์ ํ๊ฒ ํ ๋น ํด์ ๋ ์ ์์ต๋๋ค.
์ฐธ์กฐ ์ถ์ : ๋จ๊ณ๋ณ ํ๋ก์ธ์ค
์ฐธ์กฐ ์ถ์ ํ๋ก์ธ์ค๋ ๋ค์๊ณผ ๊ฐ์ด ๋๊ฒ ์ดํดํ ์ ์์ต๋๋ค:
- ํ์(Mark) ๋จ๊ณ: GC ์๊ณ ๋ฆฌ์ฆ์ ๋ฃจํธ ๊ฐ์ฒด์์ ์์ํ์ฌ ์ ์ฒด ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์ํํฉ๋๋ค. ์ด ์ํ ์ค์ ๋ง๋๋ ๋ชจ๋ ๊ฐ์ฒด๋ ์ด์์๋ค๊ณ "ํ์(mark)"๋ฉ๋๋ค. ์ด๋ ์ข ์ข ๊ฐ์ฒด์ ๋ฉํ๋ฐ์ดํฐ์ ๋นํธ๋ฅผ ์ค์ ํ๊ฑฐ๋ ํ์๋ ๊ฐ์ฒด๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ๋ณ๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค.
- ์๊ฑฐ(Sweep) ๋จ๊ณ: ํ์ ๋จ๊ณ๊ฐ ์๋ฃ๋ ํ, GC๋ ํ์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ํํฉ๋๋ค. ๋ง์ฝ ๊ฐ์ฒด๊ฐ "ํ์"๋ ๊ฒ์ผ๋ก ๋ฐ๊ฒฌ๋๋ฉด, ์ด์์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๊ณ ๋ค์ GC ์ฃผ๊ธฐ๋ฅผ ์ํด ํ์๊ฐ ์ง์์ง๋๋ค. ๋ง์ฝ ๊ฐ์ฒด๊ฐ "ํ์๋์ง ์์" ๊ฒ์ผ๋ก ๋ฐ๊ฒฌ๋๋ฉด, ์ด๋ ์ด๋ค ๋ฃจํธ์์๋ ๋๋ฌํ ์ ์์์์ ์๋ฏธํ๋ฏ๋ก ๊ฐ๋น์ง์ ๋๋ค. ์ด๋ฌํ ํ์๋์ง ์์ ๊ฐ์ฒด๊ฐ ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ๋ ํ์๋์ด ํฅํ ํ ๋น์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
Mark-and-Compact ๋๋ Generational GC์ ๊ฐ์ ๋ ์ ๊ตํ GC ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ ์ค๋จ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด ์ด ๊ธฐ๋ณธ์ ์ธ mark-and-sweep ์ ๊ทผ ๋ฐฉ์์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Mark-and-Compact๋ ๊ฐ๋น์ง๋ฅผ ์๋ณํ ๋ฟ๋ง ์๋๋ผ ์ด์์๋ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์๋ก ๊ฐ๊น๊ฒ ์ด๋์์ผ ์กฐ๊ฐํ๋ฅผ ์ค์ด๊ณ ์บ์ ์ง์ญ์ฑ์ ํฅ์์ํต๋๋ค. Generational GC๋ ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ์ ์ ๋ ์ฃฝ๋๋ค๊ณ ๊ฐ์ ํ๊ณ ๊ฐ์ฒด๋ฅผ ๋์ด์ ๋ฐ๋ผ "์ธ๋(generations)"๋ก ๋ถ๋ฆฌํ์ฌ ์๋ก์ด ์ธ๋์ GC ๋ ธ๋ ฅ์ ์ง์คํฉ๋๋ค.
WebAssembly GC์ ํธ์คํธ ํ๊ฒฝ๊ณผ์ ํตํฉ
WebAssembly์ GC ์ ์์ ๋ชจ๋์์ด๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๋จ์ผ GC ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ ํ๋ ๋์ , Wasm ๋ชจ๋์ด GC ๊ธฐ๋ฅ๊ณผ ์ํธ ์์ฉํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ฉฐ, ํนํ ์น ๋ธ๋ผ์ฐ์ (JavaScript)๋ ์๋ฒ ์ธก ๋ฐํ์๊ณผ ๊ฐ์ ํธ์คํธ ํ๊ฒฝ ๋ด์์ ์คํ๋ ๋ ๊ทธ๋ ์ต๋๋ค.
Wasm GC์ JavaScript
๊ฐ์ฅ ๋๋๋ฌ์ง ํตํฉ์ JavaScript์์ ํตํฉ์ ๋๋ค. Wasm ๋ชจ๋์ด JavaScript ๊ฐ์ฒด์ ์ํธ ์์ฉํ๊ฑฐ๋ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ, ์ค์ํ ๊ณผ์ ๊ฐ ๋ฐ์ํฉ๋๋ค: ์ ์ฌ์ ์ผ๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ๊ณผ GC ๋ฉ์ปค๋์ฆ์ ๊ฐ์ง ๋ ํ๊ฒฝ์ด ์ด๋ป๊ฒ ์ฐธ์กฐ๋ฅผ ์ ํํ๊ฒ ์ถ์ ํ ์ ์์๊น์?
WebAssembly GC ์ ์์ ์ฐธ์กฐ ํ์ (reference types)์ ๋์ ํฉ๋๋ค. ์ด ํน๋ณํ ํ์ ๋ค์ Wasm ๋ชจ๋์ด JavaScript ๊ฐ์ฒด์ ๊ฐ์ด ํธ์คํธ ํ๊ฒฝ์ GC์ ์ํด ๊ด๋ฆฌ๋๋ ๊ฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ ์ ์๊ฒ ํฉ๋๋ค. ๋ฐ๋๋ก, JavaScript๋ Wasm์ด ๊ด๋ฆฌํ๋ ๊ฐ์ฒด(์: Wasm ํ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ)์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ ์ ์์ต๋๋ค.
์๋ ๋ฐฉ์:
- Wasm์ด JS ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ๋ ๊ฒฝ์ฐ: Wasm ๋ชจ๋์ JavaScript ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ ํ์ ์ ๋ฐ๊ฑฐ๋ ์์ฑํ ์ ์์ต๋๋ค. Wasm ๋ชจ๋์ด ์ด๋ฌํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ๋ฉด, JavaScript GC๋ ์ด ์ฐธ์กฐ๋ฅผ ๋ณด๊ณ ๊ฐ์ฒด๊ฐ ์ฌ์ ํ ์ฌ์ฉ ์ค์์ ์ดํดํ์ฌ ์กฐ๊ธฐ์ ์์ง๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- JS๊ฐ Wasm ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ๋ ๊ฒฝ์ฐ: ๋ง์ฐฌ๊ฐ์ง๋ก, JavaScript ์ฝ๋๋ Wasm ๊ฐ์ฒด(์: Wasm ํ์ ํ ๋น๋ ๊ฐ์ฒด)์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ ์ ์์ต๋๋ค. JavaScript GC์ ์ํด ๊ด๋ฆฌ๋๋ ์ด ์ฐธ์กฐ๋ JavaScript ์ฐธ์กฐ๊ฐ ์กด์ฌํ๋ ํ Wasm ๊ฐ์ฒด๊ฐ Wasm GC์ ์ํด ์์ง๋์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ด๋ฌํ ํ๊ฒฝ ๊ฐ ์ฐธ์กฐ ์ถ์ ์ ์ํํ ์ํธ ์ด์ฉ์ฑ์ ์ํด ํ์์ ์ด๋ฉฐ, ๋ค๋ฅธ ํ๊ฒฝ์ ๋๊ธ๋ง ์ฐธ์กฐ๋ก ์ธํด ๊ฐ์ฒด๊ฐ ๋ฌด๊ธฐํ์ผ๋ก ์ด์์๊ฒ ๋๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
๋น-JavaScript ๋ฐํ์์ ์ํ Wasm GC
๋ธ๋ผ์ฐ์ ๋ฅผ ๋์ด, WebAssembly๋ ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์ฃ์ง ์ปดํจํ ์์ ์๋ฆฌ๋ฅผ ์ก๊ณ ์์ต๋๋ค. Wasmtime, Wasmer์ ๊ฐ์ ๋ฐํ์ ๋ฐ ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด ๋ด์ ํตํฉ ์๋ฃจ์ ๊น์ง Wasm์ ์ ์ฌ๋ ฅ์ ํ์ฉํ๊ณ ์์ต๋๋ค. ์ด๋ฌํ ๋งฅ๋ฝ์์ Wasm GC๋ ๋์ฑ ์ค์ํด์ง๋๋ค.
Wasm์ผ๋ก ์ปดํ์ผ๋๊ณ ์์ฒด์ ์ธ ์ ๊ตํ GC๋ฅผ ๊ฐ์ง ์ธ์ด(์: Go, ์ฐธ์กฐ ์นด์ดํ ์ ์ฌ์ฉํ๋ Rust, ๋๋ ๊ด๋ฆฌ๋๋ ํ์ ๊ฐ์ง .NET)์ ๊ฒฝ์ฐ, Wasm GC ์ ์์ ์ด๋ฌํ ๋ฐํ์์ด Wasm ํ๊ฒฝ ๋ด์์ ํ์ ๋ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค. Wasm ๋ชจ๋์ด ํธ์คํธ์ GC์๋ง ์์กดํ๋ ๋์ , Wasm GC์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์์ฒด ํ์ ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ ์ฌ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค:
- ์ค๋ฒํค๋ ๊ฐ์: ์ธ์ด๋ณ ๊ฐ์ฒด ์๋ช ์ฃผ๊ธฐ์ ๋ํด ํธ์คํธ GC์ ๋ํ ์์กด๋ ๊ฐ์.
- ์์ธก ๊ฐ๋ฅํ ์ฑ๋ฅ: ์ฑ๋ฅ์ ๋ฏผ๊ฐํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํด์ ์ฃผ๊ธฐ์ ๋ํ ๋ ๋ง์ ์ ์ด.
- ์ง์ ํ ์ด์์ฑ: GC ์์กด๋๊ฐ ๋์ ์ธ์ด๊ฐ ์๋นํ ๋ฐํ์ ํดํน ์์ด Wasm ํ๊ฒฝ์์ ์ปดํ์ผํ๊ณ ์คํํ ์ ์๋๋ก ํจ.
๊ธ๋ก๋ฒ ์์: ๋ค์ํ ์ธ์ด(์: ํ ์๋น์ค๋ Go, ๋ค๋ฅธ ์๋น์ค๋ Rust, ๋ถ์์ฉ์ผ๋ก๋ Python)๋ก ์์ฑ๋ ์ฌ๋ฌ ์๋น์ค๋ก ๊ตฌ์ฑ๋ ๋๊ท๋ชจ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๋ฅผ ์๊ฐํด๋ณด์ธ์. ์ด๋ฌํ ์๋น์ค๋ค์ด ํน์ ๊ณ์ฐ ์ง์ฝ์ ์์ ์ ์ํด Wasm ๋ชจ๋์ ํตํด ํต์ ํ๋ค๋ฉด, ์ด๋ค ๋ชจ๋ ๊ฐ์ ํตํฉ๋๊ณ ํจ์จ์ ์ธ GC ๋ฉ์ปค๋์ฆ์ ๊ณต์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ์ฒด ์์คํ ์ ๋ถ์์ ํ๊ฒ ๋ง๋ค ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
Wasm์ ์ฐธ์กฐ ์ถ์ ์ฌ์ธต ๋ถ์
WebAssembly GC ์ ์์ ํน์ ์ฐธ์กฐ ํ์ ์งํฉ๊ณผ ์ถ์ ๊ท์น์ ์ ์ํฉ๋๋ค. ์ด๋ ๋ค๋ฅธ Wasm ๊ตฌํ ๋ฐ ํธ์คํธ ํ๊ฒฝ ๊ฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
Wasm ์ฐธ์กฐ ์ถ์ ์ ํต์ฌ ๊ฐ๋
- `gc` ์ ์: Wasm์ด ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ ๊ฐ๊ณผ ์ด๋ป๊ฒ ์ํธ ์์ฉํ ์ ์๋์ง ์ ์ํ๋ ํฌ๊ด์ ์ธ ์ ์์ ๋๋ค.
- ์ฐธ์กฐ ํ์ : Wasm ํ์ ์์คํ ์ ์๋ก์ด ํ์ ๋ค์ ๋๋ค(์: `externref`, `funcref`, `eqref`, `i33ref`). `externref`๋ ํธ์คํธ ๊ฐ์ฒด์ ์ํธ ์์ฉํ๋ ๋ฐ ํนํ ์ค์ํฉ๋๋ค.
- ํ ํ์ : Wasm์ ์ด์ ์์ฒด ํ ํ์ ์ ์ ์ํ ์ ์์ด, ๋ชจ๋์ด ํน์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ๊ฐ์ฒด ์ปฌ๋ ์ ์ ๊ด๋ฆฌํ ์ ์๊ฒ ํฉ๋๋ค.
- ๋ฃจํธ ์งํฉ: ๋ค๋ฅธ GC ์์คํ ๊ณผ ์ ์ฌํ๊ฒ, Wasm GC๋ ์ ์ญ ๋ณ์, ์คํ ๋ณ์ ๋ฐ ํธ์คํธ ํ๊ฒฝ์ผ๋ก๋ถํฐ์ ์ฐธ์กฐ๋ฅผ ํฌํจํ๋ ๋ฃจํธ ์งํฉ์ ์ ์งํฉ๋๋ค.
์ถ์ ๋ฉ์ปค๋์ฆ
Wasm ๋ชจ๋์ด ์คํ๋ ๋, ๋ฐํ์(๋ธ๋ผ์ฐ์ ์ JavaScript ์์ง ๋๋ ๋ ๋ฆฝํ Wasm ๋ฐํ์)์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ณ GC๋ฅผ ์ํํ ์ฑ ์์ด ์์ต๋๋ค. Wasm ๋ด์ ์ถ์ ํ๋ก์ธ์ค๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฆ ๋๋ค:
- ๋ฃจํธ ์ด๊ธฐํ: ๋ฐํ์์ ๋ชจ๋ ํ์ฑ ๋ฃจํธ ๊ฐ์ฒด๋ฅผ ์๋ณํฉ๋๋ค. ์ฌ๊ธฐ์๋ Wasm ๋ชจ๋์ ์ํด ์ฐธ์กฐ๋๋ ํธ์คํธ ํ๊ฒฝ์ด ๋ณด์ ํ ๋ชจ๋ ๊ฐ(`externref`๋ฅผ ํตํด)๊ณผ Wasm ๋ชจ๋ ์์ฒด ๋ด์์ ๊ด๋ฆฌ๋๋ ๋ชจ๋ ๊ฐ(์ ์ญ ๋ณ์, ์คํ ํ ๋น ๊ฐ์ฒด)์ด ํฌํจ๋ฉ๋๋ค.
- ๊ทธ๋ํ ์ํ: ๋ฃจํธ์์ ์์ํ์ฌ ๋ฐํ์์ ์ฌ๊ท์ ์ผ๋ก ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํ์ํฉ๋๋ค. ๋ฐฉ๋ฌธํ ๊ฐ ๊ฐ์ฒด์ ๋ํด ํ๋๋ ์์๋ฅผ ๊ฒ์ฌํฉ๋๋ค. ๋ง์ฝ ์์ ์์ฒด๊ฐ ์ฐธ์กฐ(์: ๋ค๋ฅธ ๊ฐ์ฒด ์ฐธ์กฐ, ํจ์ ์ฐธ์กฐ)๋ผ๋ฉด, ์ํ๋ ๊ทธ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ๊ณ์๋ฉ๋๋ค.
- ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด ํ์: ์ด ์ํ ์ค์ ๋ฐฉ๋ฌธํ ๋ชจ๋ ๊ฐ์ฒด๋ ๋๋ฌ ๊ฐ๋ฅํ๋ค๊ณ ํ์๋ฉ๋๋ค. ์ด ํ์๋ ์ข ์ข ๋ฐํ์์ GC ๊ตฌํ ๋ด์์ ๋ด๋ถ ์์ ์ผ๋ก ์ํ๋ฉ๋๋ค.
- ๋๋ฌ ๋ถ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ํ์: ์ํ๊ฐ ์๋ฃ๋ ํ, ๋ฐํ์์ Wasm ํ(๊ทธ๋ฆฌ๊ณ ์ ์ฌ์ ์ผ๋ก Wasm์ด ์ฐธ์กฐํ๋ ํธ์คํธ ํ์ ์ผ๋ถ)์ ์ค์บํฉ๋๋ค. ๋๋ฌ ๊ฐ๋ฅํ๋ค๊ณ ํ์๋์ง ์์ ๋ชจ๋ ๊ฐ์ฒด๋ ๊ฐ๋น์ง๋ก ๊ฐ์ฃผ๋๊ณ ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ ํ์๋ฉ๋๋ค. ์ด ๊ณผ์ ์์ ํ์ ์์ถํ์ฌ ์กฐ๊ฐํ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
`externref` ์ถ์ ์์: `wasm-bindgen` ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ JavaScript DOM ์์์ ์ํธ ์์ฉํ๋ Rust๋ก ์์ฑ๋ Wasm ๋ชจ๋์ ์์ํด๋ณด์ธ์. Rust ์ฝ๋๋ DOM ๋ ธ๋๋ฅผ ๋ํ๋ด๋ `JsValue`(`externref`๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ)๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด `JsValue`๋ ์ค์ JavaScript ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํฉ๋๋ค. Rust GC ๋๋ ํธ์คํธ GC๊ฐ ์คํ๋ ๋, ์ด `externref`๋ฅผ ๋ฃจํธ๋ก ๊ฐ์ฃผํ ๊ฒ์ ๋๋ค. ๋ง์ฝ `JsValue`๊ฐ ์คํ์ด๋ ์ ์ญ ๋ฉ๋ชจ๋ฆฌ์ ์ด์์๋ Rust ๋ณ์์ ์ํด ์ฌ์ ํ ๋ณด์ ๋๊ณ ์๋ค๋ฉด, DOM ๋ ธ๋๋ JavaScript์ GC์ ์ํด ์์ง๋์ง ์์ ๊ฒ์ ๋๋ค. ๋ฐ๋๋ก, JavaScript๊ฐ Wasm ๊ฐ์ฒด(์: `WebAssembly.Global` ์ธ์คํด์ค)์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ํด๋น Wasm ๊ฐ์ฒด๋ Wasm ๋ฐํ์์ ์ํด ์ด์์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ฐ๋ฐ์๋ฅผ ์ํ ๊ณผ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
Wasm GC๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด์ง๋ง, ๊ธ๋ก๋ฒ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ๊ฐ๋ฐ์๋ค์ ํน์ ๋ฏธ๋ฌํ ์ฐจ์ด์ ์ ์ธ์งํด์ผ ํฉ๋๋ค:
- ๋ฐํ์ ์์กด์ฑ: ์ค์ GC ๊ตฌํ ๋ฐ ์ฑ๋ฅ ํน์ฑ์ ๋ค๋ฅธ Wasm ๋ฐํ์(์: Chrome์ V8, Firefox์ SpiderMonkey, Node.js์ V8, Wasmtime๊ณผ ๊ฐ์ ๋ ๋ฆฝํ ๋ฐํ์) ๊ฐ์ ํฌ๊ฒ ๋ค๋ฅผ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ๋์ ๋ฐํ์์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํด์ผ ํฉ๋๋ค.
- ์ํธ ์ด์ฉ์ฑ ์ค๋ฒํค๋: Wasm๊ณผ JavaScript ๊ฐ์ `externref` ํ์ ์ ์์ฃผ ์ ๋ฌํ๋ ๊ฒ์ ์ฝ๊ฐ์ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค. ํจ์จ์ ์ผ๋ก ์ค๊ณ๋์์ง๋ง, ๋งค์ฐ ๋น๋ฒํ ์ํธ ์์ฉ์ ์ฌ์ ํ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค. Wasm-JS ์ธํฐํ์ด์ค์ ์ ์คํ ์ค๊ณ๊ฐ ์ค์ํฉ๋๋ค.
- ์ธ์ด์ ๋ณต์ก์ฑ: ๋ณต์กํ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ๊ฐ์ง ์ธ์ด(์: ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ C++)๋ Wasm์ผ๋ก ์ปดํ์ผ๋ ๋ ์ ์คํ ํตํฉ์ด ํ์ํฉ๋๋ค. ๊ทธ๋ค์ ๋ฉ๋ชจ๋ฆฌ๊ฐ Wasm์ GC์ ์ํด ์ฌ๋ฐ๋ฅด๊ฒ ์ถ์ ๋๊ฑฐ๋, GC๋ฅผ ๋ฐฉํดํ์ง ์๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค.
- ๋๋ฒ๊น : GC์ ๊ด๋ จ๋ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ๊ฒ์ฌํ๊ณ , ๋์์ ๊ทผ๋ณธ ์์ธ์ ์๋ณํ๋ฉฐ, GC ์ค๋จ ์๊ฐ์ ์ดํดํ๊ธฐ ์ํ ๋๊ตฌ์ ๊ธฐ์ ์ด ํ์์ ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ Wasm ๋๋ฒ๊น ์ง์์ ์ ์ ๋ ์ถ๊ฐํ๊ณ ์์ง๋ง, ์ด๋ ๊ณ์ ๋ฐ์ ํ๋ ๋ถ์ผ์ ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ด์ธ์ ๋ฆฌ์์ค ๊ด๋ฆฌ: GC๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ์ง๋ง, ๋ค๋ฅธ ๋ฆฌ์์ค(ํ์ผ ํธ๋ค, ๋คํธ์ํฌ ์ฐ๊ฒฐ ๋๋ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฆฌ์์ค ๋ฑ)๋ ์ฌ์ ํ ๋ช ์์ ์ธ ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. GC๋ Wasm GC ํ๋ ์์ํฌ ๋ด์์ ๋๋ ํธ์คํธ GC์ ์ํด ๊ด๋ฆฌ๋๋ ๋ฉ๋ชจ๋ฆฌ์๋ง ์ ์ฉ๋๋ฏ๋ก ๊ฐ๋ฐ์๋ ์ด๋ฌํ ๋ฆฌ์์ค๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฆฌ๋๋๋ก ํด์ผ ํฉ๋๋ค.
์ค์ฉ์ ์ธ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
Wasm GC ์ฐธ์กฐ ์ถ์ ์ ์ดํดํ๋ ๊ฒ์ด ํ์์ ์ธ ๋ช ๊ฐ์ง ์๋๋ฆฌ์ค๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
1. ๋ณต์กํ UI๋ฅผ ๊ฐ์ง ๋๊ท๋ชจ ์น ์ ํ๋ฆฌ์ผ์ด์
์๋๋ฆฌ์ค: React, Vue ๋๋ Angular์ ๊ฐ์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ๋ ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)์ผ๋ก, ์๋ง์ ์ปดํฌ๋ํธ, ๋ฐ์ดํฐ ๋ชจ๋ธ ๋ฐ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ์๋ ๋ณต์กํ UI๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ํต์ฌ ๋ก์ง์ด๋ ๋ฌด๊ฑฐ์ด ๊ณ์ฐ์ Rust๋ C++๋ก ์์ฑ๋ Wasm ๋ชจ๋๋ก ์คํ๋ก๋๋ ์ ์์ต๋๋ค.
Wasm GC์ ์ญํ : Wasm ๋ชจ๋์ด DOM ์์๋ JavaScript ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ํธ ์์ฉํด์ผ ํ ๋(์: UI ์ ๋ฐ์ดํธ ๋๋ ์ฌ์ฉ์ ์ ๋ ฅ ๊ฒ์), `externref`๋ฅผ ์ฌ์ฉํฉ๋๋ค. Wasm ๋ฐํ์๊ณผ JavaScript ์์ง์ ์ด๋ฌํ ์ฐธ์กฐ๋ฅผ ํ๋ ฅ์ ์ผ๋ก ์ถ์ ํด์ผ ํฉ๋๋ค. Wasm ๋ชจ๋์ด SPA์ JavaScript ๋ก์ง์ ์ํด ์ฌ์ ํ ๋ณด์ด๊ณ ๊ด๋ฆฌ๋๋ DOM ๋ ธ๋์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ๊ณ ์๋ค๋ฉด, ์ด๋ GC๋ ์ด๋ฅผ ์์งํ์ง ์์ ๊ฒ์ ๋๋ค. ๋ฐ๋๋ก, SPA์ JavaScript๊ฐ Wasm ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ๋ฆฌํ๋ฉด(์: ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ํด์ ๋ ๋), Wasm GC๋ ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ ํ๊ฒ ํ์ํ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ์ํฅ: ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ํ๋ ๊ธ๋ก๋ฒ ํ์๊ฒ ์ด๋ฌํ ํ๊ฒฝ ๊ฐ ์ฐธ์กฐ์ ์๋ ๋ฐฉ์์ ๋ํ ์ผ๊ด๋ ์ดํด๋ ์ ์ธ๊ณ ์ฌ์ฉ์, ํนํ ์ฑ๋ฅ์ด ๋ฎ์ ์ฅ์น๋ ๋๋ฆฐ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์ ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
2. ํฌ๋ก์ค ํ๋ซํผ ๊ฒ์ ๊ฐ๋ฐ
์๋๋ฆฌ์ค: ๊ฒ์ ์์ง ๋๋ ๊ฒ์์ ์๋น ๋ถ๋ถ์ด ์น ๋ธ๋ผ์ฐ์ ๋ Wasm ๋ฐํ์์ ํตํด ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์คํํ๊ธฐ ์ํด WebAssembly๋ก ์ปดํ์ผ๋ฉ๋๋ค. ์ด ๊ฒ์์ ๋ณต์กํ ์ฅ๋ฉด, ๊ฒ์ ๊ฐ์ฒด, ํ ์ค์ฒ ๋ฐ ์ค๋์ค ๋ฒํผ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
Wasm GC์ ์ญํ : ๊ฒ์ ์์ง์ ์๋ง๋ ๊ฒ์ ๊ฐ์ฒด๋ฅผ ์ํ ์์ฒด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์์ ๊ฒ์ด๋ฉฐ, ์ ์ฌ์ ์ผ๋ก ์ปค์คํ ํ ๋น์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ C++(์ค๋งํธ ํฌ์ธํฐ ์ฌ์ฉ) ๋๋ Rust์ ๊ฐ์ ์ธ์ด์ GC ๊ธฐ๋ฅ์ ์์กดํ ๊ฒ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง API(์: WebGL, WebGPU) ๋๋ ์ค๋์ค API์ ์ํธ ์์ฉํ ๋, `externref`๋ GPU ๋ฆฌ์์ค๋ ์ค๋์ค ์ปจํ ์คํธ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. Wasm GC๋ ์ด๋ฌํ ํธ์คํธ ๋ฆฌ์์ค๊ฐ ๊ฒ์ ๋ก์ง์ ์ฌ์ ํ ํ์ํ ๊ฒฝ์ฐ ์กฐ๊ธฐ์ ํ ๋น ํด์ ๋์ง ์๋๋ก ๋ณด์ฅํด์ผ ํ๋ฉฐ, ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
๊ธ๋ก๋ฒ ์ํฅ: ์ฌ๋ฌ ๋๋ฅ์ ๊ฒ์ ๊ฐ๋ฐ์๋ค์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ๊ฒฌ๊ณ ํ์ง ํ์ธํด์ผ ํฉ๋๋ค. ๊ฒ์์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ ๋๊น, ์ถฉ๋ ๋ฐ ์ข์ง ์์ ํ๋ ์ด์ด ๊ฒฝํ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. Wasm GC์ ์์ธก ๊ฐ๋ฅํ ๋์์, ์ ๋๋ก ์ดํด๋์์ ๋, ์ ์ธ๊ณ ํ๋ ์ด์ด๋ค์๊ฒ ๋ ์์ ์ ์ด๊ณ ์ฆ๊ฑฐ์ด ๊ฒ์ ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
3. Wasm์ ์ด์ฉํ ์๋ฒ ์ธก ๋ฐ ์ฃ์ง ์ปดํจํ
์๋๋ฆฌ์ค: ๋น ๋ฅธ ์์ ์๊ฐ๊ณผ ์์ ํ ๊ฒฉ๋ฆฌ๋ฅผ ์ํด Wasm์ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ๋ ๋ง์ดํฌ๋ก์๋น์ค ๋๋ ์๋น์คํ ํจ์(FaaS). ์๋น์ค๋ ์์ฒด ๋์์ฑ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ๊ฐ์ง ์ธ์ด์ธ Go๋ก ์์ฑ๋ ์ ์์ต๋๋ค.
Wasm GC์ ์ญํ : Go ์ฝ๋๊ฐ Wasm์ผ๋ก ์ปดํ์ผ๋ ๋, ํด๋น GC๋ Wasm ๋ฐํ์๊ณผ ์ํธ ์์ฉํฉ๋๋ค. Wasm GC ์ ์์ Go์ ๋ฐํ์์ด Wasm ์๋๋ฐ์ค ๋ด์์ ํ์ ๋ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค. Go Wasm ๋ชจ๋์ด ํธ์คํธ ํ๊ฒฝ(์: ํ์ผ I/O ๋๋ ๋คํธ์ํฌ ์ก์ธ์ค๋ฅผ ์ํ WASI ํธํ ์์คํ ์ธํฐํ์ด์ค)๊ณผ ์ํธ ์์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ ์ ํ ์ฐธ์กฐ ํ์ ์ ์ฌ์ฉํฉ๋๋ค. Go GC๋ ๊ด๋ฆฌ๋๋ ํ ๋ด์ ์ฐธ์กฐ๋ฅผ ์ถ์ ํ๊ณ , Wasm ๋ฐํ์์ ํธ์คํธ ๊ด๋ฆฌ ๋ฆฌ์์ค์์ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
๊ธ๋ก๋ฒ ์ํฅ: ๋ถ์ฐ๋ ๊ธ๋ก๋ฒ ์ธํ๋ผ์ ์ด๋ฌํ ์๋น์ค๋ฅผ ๋ฐฐํฌํ๋ ค๋ฉด ์์ธก ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ๋์์ด ํ์ํฉ๋๋ค. ์ ๋ฝ์ ๋ฐ์ดํฐ ์ผํฐ์์ ์คํ๋๋ Go Wasm ์๋น์ค๋ ์์์๋ ๋ถ๋ฏธ์์ ์คํ๋๋ ๋์ผํ ์๋น์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฐ ์ฑ๋ฅ ์ธก๋ฉด์์ ๋์ผํ๊ฒ ๋์ํด์ผ ํฉ๋๋ค. Wasm GC๋ ์ด๋ฌํ ์์ธก ๊ฐ๋ฅ์ฑ์ ๊ธฐ์ฌํฉ๋๋ค.
Wasm์์ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ๋ถ์์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
WebAssembly์ GC์ ์ฐธ์กฐ ์ถ์ ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ธ์:
- ์ฌ์ฉํ๋ ์ธ์ด์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ ์ดํดํ๊ธฐ: Rust, C++, Go ๋๋ ๋ค๋ฅธ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ , ํด๋น ์ธ์ด๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ๊ณ Wasm GC์ ์ด๋ป๊ฒ ์ํธ ์์ฉํ๋์ง ๋ช ํํ ์ดํดํด์ผ ํฉ๋๋ค.
- ์ฑ๋ฅ์ ๋ฏผ๊ฐํ ๊ฒฝ๋ก์์ `externref` ์ฌ์ฉ ์ต์ํํ๊ธฐ: `externref`๋ ์ํธ ์ด์ฉ์ฑ์ ์ค์ํ์ง๋ง, `externref`๋ฅผ ์ฌ์ฉํ์ฌ Wasm-JS ๊ฒฝ๊ณ๋ฅผ ๋์ด ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ฑฐ๋ ๋น๋ฒํ ํธ์ถ์ ํ๋ ๊ฒ์ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค. ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์์ ์ ์ผ๊ด ์ฒ๋ฆฌํ๊ฑฐ๋ Wasm ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ์ธ์.
- ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํ์ผ๋งํ๊ธฐ: ๋ฐํ์๋ณ ํ๋กํ์ผ๋ง ๋๊ตฌ(์: ๋ธ๋ผ์ฐ์ ์ฑ๋ฅ ํ๋กํ์ผ๋ฌ, ๋ ๋ฆฝํ Wasm ๋ฐํ์ ๋๊ตฌ)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ํซ์คํ, ์ ์ฌ์ ๋์ ๋ฐ GC ์ค๋จ ์๊ฐ์ ์๋ณํ์ธ์.
- ๊ฐ๋ ฅํ ํ์ดํ ์ฌ์ฉํ๊ธฐ: Wasm์ ํ์ ์์คํ ๊ณผ ์ธ์ด ์์ค์ ํ์ดํ์ ํ์ฉํ์ฌ ์ฐธ์กฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ๋๊ณ ์๋ํ์ง ์์ ํ์ ๋ณํ์ด ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ก ์ด์ด์ง์ง ์๋๋ก ํ์ธ์.
- ํธ์คํธ ๋ฆฌ์์ค ๋ช ์์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ: GC๋ ๋ฉ๋ชจ๋ฆฌ์๋ง ์ ์ฉ๋๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์. ํ์ผ ํธ๋ค์ด๋ ๋คํธ์ํฌ ์์ผ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ฆฌ์์ค์ ๋ํด์๋ ๋ช ์์ ์ธ ์ ๋ฆฌ ๋ก์ง์ด ๊ตฌํ๋์๋์ง ํ์ธํ์ธ์.
- Wasm GC ์ ์์ ๋ํ ์ต์ ์ ๋ณด ์ ์งํ๊ธฐ: WebAssembly GC ์ ์์ ์ง์์ ์ผ๋ก ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ์ต์ ๊ฐ๋ฐ, ์๋ก์ด ์ฐธ์กฐ ํ์ ๋ฐ ์ต์ ํ์ ๋ํ ์ ๋ณด๋ฅผ ๊ณ์ ํ์ธํ์ธ์.
- ๋ค์ํ ํ๊ฒฝ์์ ํ ์คํธํ๊ธฐ: ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ๊ณ ๋ คํ์ฌ, ๋ค์ํ ๋ธ๋ผ์ฐ์ , ์ด์ ์ฒด์ ๋ฐ Wasm ๋ฐํ์์์ Wasm ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ์ฌ ์ผ๊ด๋ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ณด์ฅํ์ธ์.
Wasm GC์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ฏธ๋
WebAssembly GC ์ ์์ Wasm์ ๋์ฑ ๋ค์ฌ๋ค๋ฅํ๊ณ ๊ฐ๋ ฅํ ํ๋ซํผ์ผ๋ก ๋ง๋๋ ์ค์ํ ๋จ๊ณ์ ๋๋ค. ์ ์์ด ์ฑ์ํด์ง๊ณ ๋ ๋๋ฆฌ ์ฑํ๋จ์ ๋ฐ๋ผ ๋ค์์ ๊ธฐ๋ํ ์ ์์ต๋๋ค:
- ์ฑ๋ฅ ํฅ์: ๋ฐํ์์ ์ค๋ฒํค๋์ ์ค๋จ ์๊ฐ์ ์ต์ํํ๊ธฐ ์ํด GC ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ฐธ์กฐ ์ถ์ ์ ๊ณ์ํด์ ์ต์ ํํ ๊ฒ์ ๋๋ค.
- ๋ ๋์ ์ธ์ด ์ง์: GC์ ํฌ๊ฒ ์์กดํ๋ ๋ ๋ง์ ์ธ์ด๋ค์ด ๋ ์ฝ๊ณ ํจ์จ์ ์ผ๋ก Wasm์ผ๋ก ์ปดํ์ผํ ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
- ํฅ์๋ ๋๊ตฌ: ๋๋ฒ๊น ๋ฐ ํ๋กํ์ผ๋ง ๋๊ตฌ๊ฐ ๋์ฑ ์ ๊ตํด์ ธ Wasm ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ๋ ์ฌ์์ง ๊ฒ์ ๋๋ค.
- ์๋ก์ด ์ฌ์ฉ ์ฌ๋ก: ํ์คํ๋ GC๊ฐ ์ ๊ณตํ๋ ๊ฒฌ๊ณ ํจ์ ๋ธ๋ก์ฒด์ธ, ์๋ฒ ๋๋ ์์คํ ๋ฐ ๋ณต์กํ ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ฐ์ ๋ถ์ผ์์ Wasm์ ์๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก
WebAssembly์ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ ์ฐธ์กฐ ์ถ์ ๋ฉ์ปค๋์ฆ์ ์์ ํ๊ณ ํจ์จ์ ์ด๋ฉฐ ์ด์ ๊ฐ๋ฅํ ์คํ์ ์ ๊ณตํ๋ ๋ฅ๋ ฅ์ ๊ธฐ๋ณธ์ ๋๋ค. ๋ฃจํธ๊ฐ ์ด๋ป๊ฒ ์๋ณ๋๋์ง, ๊ฐ์ฒด ๊ทธ๋ํ๊ฐ ์ด๋ป๊ฒ ์ํ๋๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ํ๊ฒฝ ๊ฐ์ ์ฐธ์กฐ๊ฐ ์ด๋ป๊ฒ ๊ด๋ฆฌ๋๋์ง๋ฅผ ์ดํดํจ์ผ๋ก์จ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ ๋ ๊ฒฌ๊ณ ํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ๊ฐ๋ฐ ํ์๊ฒ Wasm GC๋ฅผ ํตํ ํตํฉ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๊ทผ ๋ฐฉ์์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋น์ํฌ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ํ์ ์ค์ด๋ฉฐ, ๋ค์ํ ํ๋ซํผ๊ณผ ์ฌ์ฉ ์ฌ๋ก์ ๊ฑธ์ณ WebAssembly์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ๋ฐํํ๊ฒ ํฉ๋๋ค. Wasm์ด ๊ณ์ํด์ ๋น ๋ฅด๊ฒ ๋ถ์ํจ์ ๋ฐ๋ผ, ๊ทธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ์ ๋ง์คํฐํ๋ ๊ฒ์ ์ฐจ์ธ๋ ๊ธ๋ก๋ฒ ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์์ด ํต์ฌ์ ์ธ ์ฐจ๋ณ์ ์ด ๋ ๊ฒ์ ๋๋ค.